package com.sprouting.personal.exception;

import com.sprouting.personal.emums.ResultEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.error.ErrorAttributeOptions;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.WebRequest;

import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author ：LX
 * 创建时间： 2020/10/12. 17:44
 * 地点：广州
 * 目的: 统一的默认的异常处理类，否则某些异常，会springboot将自己的默认异常信息传过去。
 *          主要是统一异常处理，且解决没有输出错误的问题。
 * 备注说明：注意，DefaultErrorAttributes的包有两个，且非常相似，而且里面的方法也一样，但如果注入失败就报错了
 */
@Component
@Slf4j
public class UnifiedDefaultErrorAttributes extends DefaultErrorAttributes {

    /**
     * 重写异常返回方法
     * @param webRequest
     * @param options
     * @return
     */
    @Override
    public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {

        Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, options);
        log.error("6、springboot默认异常捕获：错误状态码：{}， 访问请求路径：{}, 错误信息：{}", errorAttributes.get("status"), errorAttributes.get("path"), errorAttributes.get("message"));

        Map<String, Object> map = new LinkedHashMap();
        map.put("code", errorAttributes.get("status"));
        map.put("status", ResultEnum.ERROR.getStatus());
        map.put("msg", "访问异常或访问页面不存在");

        map.put("timestamp", new Date());
        map.put("error", null);
        map.put("message", null);

        return map;
    }
}
